<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
<script>
// ES6的类与继承
// JS中没有类，ES6引入class的概念
// class是一种语法糖
// class关键字，用于定义一个类
class Cat{// 父类
    constructor(n){// 构造器
        this.name = n;
    }
    type = 'animal';// 实例对象的属性
    skill(){// 原型上的方法
        console.log( '抓老鼠' )
    }
    static abc = 123;// 静态属性
    static say(){// 静态方法
        console.log( '喵' )
    }
}

class Dog extends Cat{// 子类
    constructor(f,n){
        // 注意：先调用super方法然后才能使用this关键字，否则报错
        super(n);// Cat.call(this,n);
        this.food = f;
    }
}
let dog1 = new Dog('骨头','大黄');


// ES6中Object的静态
// Object.getOwnPropertySymbols(obj)获取obj对象所有的Symbol属性，返回数组
// Object.keys(obj)获取obj对象所有可枚举属性，返回数组
// Object.values(obj)获取obj对象所有可枚举属性的值，返回数组
// Object.entries(obj)获取obj对象所有可枚举属性和值,返回二维数组
// Object.is(val1,val2)判断val1和val2是否全等（===）
// NaN === NaN  false
// +0 === -0  true
// Object.is(NaN,NaN)  true
// Object.is(+0,-0)  false
// Object.assign(obj1,obj2,obj3...)将obj2,obj3...的属性拷贝到obj1上（浅拷贝）
// 浅拷贝，只拷贝引用地址
// 深拷贝，重新创建一个一样的对象
     

// Promise承诺
// Promise是ES6对异步编程的一种解决方案
// Promise可以避免多层回调函数嵌套，可以将异步编程按照同步的流程表达出来
// Promise是一个容器，里面放着将来完成的异步操作

// Promise的状态：只有三种状态
// pending 进行中
// fulfilled 成功
// rejected 失败

// Promise的状态改变：只有两种改变
// 1.从 pending 改变为 fulfilled
// 2.从 pending 改变为 rejected

// 注意：Promise对象的状态只能改变一次！！！

// Promise对象重点关注它的 状态和结果！

// 创建Promise对象
let p1 = new Promise((resolve,reject)=>{// excutor执行器函数，同步执行
    console.log( '执行器函数被调用。。。' );
    // resolve是一个函数，用于将p1的状态改变为成功
    // reject是一个函数，用于将p1的状态改变为失败

    // 1.执行resolve函数，p1状态为成功，结果为resolve的参数
    // 2.执行reject函数，p1状态为失败，结果为reject的参数
    // 3.出现异常情况，p1状态为失败，结果为异常信息

    // 其他行为都不能改变p1的状态和结果，p1为进行中状态
})

// p1.then(fn1,fn2)指定p1成功和失败的回调函数，返回一个新的Promise对象
// 如果p1成功状态，执行fn1函数
// 如果p1失败状态，执行fn2函数
p1.then(// 同步执行
    (res)=>{// p1成功的回调，异步执行
        console.log( 'p1成功', res );

        // 1.返回非Promise对象值时,p2为成功状态,结果为return的返回值
        // return 123;

        // 2.返回Promise对象值时,p2的状态和结果跟随返回的Promise对象的状态和结果
        // return new Promise((resolve,reject)=>{
        //     // resolve(11);// p2为成功,结果为11
        //     // reject(22);// p2为失败,结果为22
        //     // 不执行修改Promise状态的操作时,p2为进行中状态(终止链式调用)
        // })

        // 3.出现异常情况，p2状态为失败，结果为异常信息
    },
    (res)=>{// p1失败的回调，异步执行
        console.log( 'p1失败', res );
    }
)// P2的状态和结果取决于：p1回调函数的返回值
.then(// p2.then()
    (res)=>{// p2成功的回调，异步执行
        console.log( 'p2成功', res );
    },
    (res)=>{// p2失败的回调，异步执行
        console.log( 'p2失败', res );
    }
)

</script>
</body>
</html>